import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes
import org.objectweb.asm.commons.AdviceAdapter

/**
 * author： suliang
 * 2022/10/21 9:57
 * describe : 直接继承并实现抽象类 MethodVisitor，而是继承 AdviceAdapter —— 它是继承自 MethodVisitor 的，这样的好处是简化了代码，只需要添加我们需要的逻辑即可 —— 这里我们打印了所调用方法的类及名字。
 */
class OwnMethodVisitor(private val className:String, nextMethodVisitor: MethodVisitor, access:Int, name:String?, descriptor:String?)
    : AdviceAdapter(Opcodes.ASM5,nextMethodVisitor,access,name,descriptor){

    override fun onMethodEnter() {
        // 往栈上加载两个变量，用于后面的函数调用
        mv.visitLdcInsn("LogMethodVisitor")
        mv.visitLdcInsn("enter: $className.$name")
        //调用 android.util.Log函数
        mv.visitMethodInsn(Opcodes.INVOKESTATIC,"android/util/Log","i","(Ljava/lang/String;Ljava/lang/String;)I",false)

        super.onMethodEnter()
    }

    override fun onMethodExit(opcode: Int) {
        super.onMethodExit(opcode)
    }
}